#include "device_windows.h"
#include "styles.h"
#include "utils.h"

// ==============================
// 设备窗口全局变量定义
// ==============================

// 注意：这些变量已经在 mywin.c 中定义，这里只需要使用 extern 声明
// 不要在这里重复定义

// ==============================
// 内部辅助函数
// ==============================

/**
 * @brief 创建基础窗口框架
 * @param parent 父对象
 * @return 创建的窗口对象
 * 
 * 创建具有统一样式和关闭按钮的窗口框架
 */
static lv_obj_t *create_base_window(lv_obj_t *parent)
{
    lv_obj_t *win = lv_win_create(parent, 0);    // 创建窗口（标题栏高度为0）
    lv_obj_set_size(win, 400, 320);              // 设置窗口大小
    lv_obj_align(win, LV_ALIGN_CENTER, 0, 15);   // 设置窗口对齐位置
    
    lv_obj_t *content = lv_win_get_content(win); // 获取窗口内容区域
    lv_obj_add_style(content, &style_content, LV_PART_MAIN); // 应用内容区域样式
    
    return win;                                  // 返回窗口对象
}

/**
 * @brief 为窗口添加关闭按钮
 * @param content 窗口内容区域
 * @param win 窗口对象
 * 
 * 在窗口右上角添加关闭按钮并绑定事件
 */
static void add_close_button(lv_obj_t *content, lv_obj_t *win)
{
    lv_obj_t *close_btn = lv_imgbtn(content, 323, 0, 32, 32, "S:/root/close.png"); // 创建关闭按钮
    lv_obj_add_event_cb(close_btn, close_win_event_cb, LV_EVENT_CLICKED, win);     // 绑定关闭事件
}

// ==============================
// 台灯窗口
// ==============================

/**
 * @brief 创建台灯控制窗口
 * @param parent 父对象
 * @return 创建的台灯窗口对象
 * 
 * 创建包含三个台灯开关的控制窗口
 */
lv_obj_t *create_lamp_window(lv_obj_t *parent)
{
    lv_obj_t *win = create_base_window(parent);  // 创建基础窗口
    lv_obj_t *content = lv_win_get_content(win); // 获取内容区域

    // 台灯标签和开关配置
    const char *lamp_labels[] = {"台灯1", "台灯2", "台灯3"}; // 台灯标签文本
    lv_obj_t *switches[3];                        // 开关对象数组
    lv_obj_t *labels[3];                          // 标签对象数组

    for(int i = 0; i < 3; i++) {                 // 循环创建三个台灯控制
        // 创建台灯标签
        labels[i] = lv_label_create(content);    // 创建标签对象
        lv_label_set_text(labels[i], lamp_labels[i]); // 设置标签文本
        lv_obj_set_style_text_font(labels[i], &lv_font_montserrat_16, LV_PART_MAIN); // 设置英文字体
        lv_obj_set_pos(labels[i], 100, 60 + i * 80); // 设置标签位置（垂直间距80像素）
        lv_obj_set_style_text_color(labels[i], lv_color_hex(0xFFFFFF), LV_PART_MAIN); // 设置文本颜色为白色
        lv_obj_set_style_text_font(labels[i], &chinese_ziku, 0); // 设置中文字体

        // 创建台灯开关
        switches[i] = lv_switch_create(content); // 创建开关对象
        lv_obj_set_size(switches[i], 60, 30);    // 设置开关大小
        lv_obj_set_pos(switches[i], 170, 55 + i * 80); // 设置开关位置（与标签对齐）
    }

    add_close_button(content, win);              // 添加关闭按钮

    return win;                                  // 返回创建的窗口
}

// ==============================
// 窗帘窗口
// ==============================

/**
 * @brief 窗帘滑动条事件回调
 * @param e 事件对象
 * 
 * 根据滑动条位置调整窗帘图片大小，模拟窗帘开合
 */
void slider_event_cb_curtain(lv_event_t *e)
{
    lv_obj_t *slider = lv_event_get_target(e);   // 获取事件目标（滑动条）

    int_cl = (int)lv_slider_get_value(slider);   // 获取滑动条当前值（0-100）

    lv_obj_set_size(img_cl, (3.41 * int_cl), 76); // 根据百分比调整窗帘图片宽度
    lv_img_set_src(img_cl, "S:/root/cl.jpg");    // 设置窗帘图片源（确保显示）
}

/**
 * @brief 创建窗帘控制窗口
 * @param parent 父对象
 * @return 创建的窗帘窗口对象
 * 
 * 创建包含窗帘状态显示和滑动条控制的窗口
 */
lv_obj_t *create_curtain_window(lv_obj_t *parent)
{
    lv_obj_t *win = create_base_window(parent);  // 创建基础窗口
    lv_obj_t *content = lv_win_get_content(win); // 获取内容区域

    // 创建窗帘显示标签
    lv_obj_t *curtain_label = lv_label_create(content); // 创建标签对象
    lv_label_set_text(curtain_label, "窗帘");     // 设置标签文本
    lv_obj_set_style_text_font(curtain_label, &chinese_ziku, 0); // 设置中文字体
    lv_obj_set_style_text_color(curtain_label, lv_color_white(), LV_PART_MAIN); // 设置文本颜色为白色
    lv_obj_align(curtain_label, LV_ALIGN_TOP_MID, 10, 30); // 设置标签对齐位置

    // 创建窗帘图片
    img_cl = lv_imgbtn(content, 10, 80, 341, 76, "S:/root/cl.jpg"); // 创建窗帘图片按钮

    // 创建窗帘控制滑动条
    lv_obj_t *slider = lv_slider_create(content); // 创建滑动条对象
    lv_obj_set_size(slider, 200, 20);            // 设置滑动条大小
    lv_obj_align(slider, LV_ALIGN_BOTTOM_MID, 0, 0); // 设置滑动条对齐位置
    lv_slider_set_range(slider, 0, 100);         // 设置滑动条范围0-100%
    lv_slider_set_value(slider, 100, LV_ANIM_OFF); // 设置初始值为100%
    lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_KNOB); // 设置旋钮颜色为白色

    lv_obj_add_event_cb(slider, slider_event_cb_curtain, LV_EVENT_VALUE_CHANGED, NULL); // 绑定滑动条事件

    add_close_button(content, win);              // 添加关闭按钮

    return win;                                  // 返回创建的窗口
}

// ==============================
// 空调窗口
// ==============================

/**
 * @brief 温度滑动条事件回调
 * @param e 事件对象
 * 
 * 更新温度显示标签的文本
 */
void slider_event_cb_1(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
    if(code == LV_EVENT_VALUE_CHANGED) {         // 检查是否为值改变事件
        lv_obj_t *slider = lv_event_get_target(e); // 获取滑动条对象
        lv_obj_t *label = (lv_obj_t *)lv_event_get_user_data(e); // 获取温度标签对象

        int temp_value = lv_slider_get_value(slider); // 获取当前温度值

        // 更新温度显示
        static char temp_str[8];                 // 温度字符串缓冲区
        snprintf(temp_str, sizeof(temp_str), "%d°C", temp_value); // 格式化温度字符串
        lv_label_set_text(label, temp_str);      // 更新标签文本

        printf("温度设置为: %d°C\n", temp_value); // 输出调试信息
    }
}

/**
 * @brief 空调温度颜色渐变回调
 * @param e 事件对象
 * 
 * 根据温度值改变滑动条颜色（蓝色渐变）
 */
void slider_event_cb_blue(lv_event_t *e)
{
    lv_obj_t *slider = lv_event_get_target(e);   // 获取滑动条对象

    if(lv_event_get_code(e) == LV_EVENT_VALUE_CHANGED) { // 检查是否为值改变事件
        int32_t value = lv_slider_get_value(slider); // 获取当前值

        int32_t min_val = 16, max_val = 30;      // 温度范围16-30°C
        float ratio = (float)(value - min_val) / (max_val - min_val); // 计算比例

        // 蓝色渐变：从浅蓝(135,206,235)到深蓝(0,0,128)
        uint8_t blue_value = (uint8_t)(235 - (235 - 128) * ratio); // 计算蓝色分量
        uint8_t red_green_value = (uint8_t)(206 * (1.0 - ratio));  // 计算红绿分量

        lv_color_t dynamic_color = lv_color_make(red_green_value, red_green_value, blue_value); // 创建动态颜色
        lv_obj_set_style_bg_color(slider, dynamic_color, LV_PART_INDICATOR); // 设置滑动条指示器颜色

        printf("温度: %d°C, 蓝色值: %d\n", value, blue_value); // 输出调试信息
    }
}

/**
 * @brief 灯光亮度颜色渐变回调
 * @param e 事件对象
 * 
 * 根据亮度值改变滑动条颜色（黄色渐变）
 */
void slider_event_cb_yellow(lv_event_t *e)
{
    lv_obj_t *slider = lv_event_get_target(e);   // 获取滑动条对象

    if(lv_event_get_code(e) == LV_EVENT_VALUE_CHANGED) { // 检查是否为值改变事件
        int32_t value = lv_slider_get_value(slider); // 获取当前值

        int32_t min_val = 0, max_val = 100;      // 亮度范围0-100
        float ratio = (float)(value - min_val) / (max_val - min_val); // 计算比例

        // 黄色渐变：从浅黄(255,255,150)到深黄(200,200,0)
        uint8_t yellow_value = (uint8_t)(255 - (255 - 200) * ratio); // 计算黄色分量

        lv_color_t dynamic_color = lv_color_make(yellow_value, yellow_value, (uint8_t)(150 * (1.0 - ratio))); // 创建动态颜色
        lv_obj_set_style_bg_color(slider, dynamic_color, LV_PART_INDICATOR); // 设置滑动条指示器颜色

        printf("亮度: %d%%, 黄色值: %d\n", value, yellow_value); // 输出调试信息
    }
}

/**
 * @brief 创建空调控制窗口
 * @param parent 父对象
 * @return 创建的空调窗口对象
 * 
 * 创建包含温度控制、模式选择和风速控制的空调窗口
 */
lv_obj_t *create_air_window(lv_obj_t *parent)
{
    lv_obj_t *win = create_base_window(parent);  // 创建基础窗口
    lv_obj_t *content = lv_win_get_content(win); // 获取内容区域

    // 创建空调显示标签
    lv_obj_t *air_label = lv_label_create(content); // 创建标签对象
    lv_label_set_text(air_label, "空调");        // 设置标签文本
    lv_obj_set_style_text_font(air_label, &chinese_ziku, 0); // 设置中文字体
    lv_obj_set_style_text_color(air_label, lv_color_white(), LV_PART_MAIN); // 设置文本颜色为白色
    lv_obj_align(air_label, LV_ALIGN_TOP_MID, 0, 0); // 设置标签对齐位置

    // 创建温度显示标签
    lv_obj_t *temp_label = lv_label_create(content); // 创建标签对象
    lv_label_set_text(temp_label, "24°C");       // 设置初始温度值
    lv_obj_set_style_text_color(temp_label, lv_color_white(), LV_PART_MAIN); // 设置文本颜色为白色
    lv_obj_align(temp_label, LV_ALIGN_LEFT_MID, 50, 0); // 设置标签对齐位置

    // 创建温度控制滑动条
    lv_obj_t *temp_slider = lv_slider_create(content); // 创建滑动条对象
    lv_obj_set_size(temp_slider, 50, 200);       // 设置滑动条大小（垂直方向）
    lv_obj_align(temp_slider, LV_ALIGN_CENTER, 0, 0); // 设置滑动条对齐位置
    lv_slider_set_range(temp_slider, 16, 30);    // 设置温度范围16-30°C
    lv_slider_set_value(temp_slider, 24, LV_ANIM_OFF); // 设置初始温度24°C

    // 设置滑动条样式
    lv_obj_set_style_bg_color(temp_slider, lv_color_hex(0xffffff), LV_PART_MAIN); // 设置背景颜色为白色
    lv_obj_set_style_radius(temp_slider, 10, LV_PART_INDICATOR); // 设置指示器圆角
    lv_obj_set_style_radius(temp_slider, 10, LV_PART_MAIN); // 设置主圆角

    // 设置初始颜色（24°C对应的蓝色）
    float initial_ratio = (float)(24 - 16) / (30 - 16); // 计算初始比例
    uint8_t red = (uint8_t)(135 * (1.0 - initial_ratio)); // 计算红色分量
    uint8_t green = (uint8_t)(206 * (1.0 - initial_ratio)); // 计算绿色分量
    uint8_t blue = (uint8_t)(235 + (128 - 235) * initial_ratio); // 计算蓝色分量
    lv_color_t initial_color = lv_color_make(red, green, blue); // 创建初始颜色
    lv_obj_set_style_bg_color(temp_slider, initial_color, LV_PART_INDICATOR); // 设置指示器颜色

    // 隐藏旋钮：设置其背景和边框为完全透明
    lv_obj_set_style_bg_opa(temp_slider, LV_OPA_TRANSP, LV_PART_KNOB);     // 背景透明
    lv_obj_set_style_border_opa(temp_slider, LV_OPA_TRANSP, LV_PART_KNOB); // 边框透明
    lv_obj_set_style_width(temp_slider, 0, LV_PART_KNOB);                  // 设置旋钮宽度为0
    lv_obj_set_style_height(temp_slider, 0, LV_PART_KNOB);                 // 设置旋钮高度为0

    // 绑定滑动条事件
    lv_obj_add_event_cb(temp_slider, slider_event_cb_1, LV_EVENT_VALUE_CHANGED, temp_label);
    lv_obj_add_event_cb(temp_slider, slider_event_cb_blue, LV_EVENT_VALUE_CHANGED, NULL);

    // 创建制冷模式按钮
    lv_obj_t *cool = lv_imgbtn_create(content);  // 创建图片按钮对象
    lv_obj_set_size(cool, 52, 52);               // 设置按钮大小
    lv_obj_align(cool, LV_ALIGN_TOP_RIGHT, -46, 53); // 设置按钮对齐位置
    lv_obj_add_style(cool, &style_pr, LV_STATE_PRESSED); // 添加按下状态样式
    lv_obj_add_flag(cool, LV_OBJ_FLAG_CHECKABLE); // 使按钮可切换状态
    lv_imgbtn_set_src(cool, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/cool.png", NULL); // 默认状态图片
    lv_imgbtn_set_src(cool, LV_IMGBTN_STATE_CHECKED_RELEASED, NULL, "S:/root/bluecool.png", NULL); // 选中状态图片

    // 创建风速控制按钮
    lv_obj_t *wind = lv_imgbtn_create(content);  // 创建图片按钮对象
    lv_obj_set_size(wind, 52, 52);               // 设置按钮大小
    lv_obj_align(wind, LV_ALIGN_TOP_RIGHT, -46, 176); // 设置按钮对齐位置
    lv_obj_add_style(wind, &style_pr, LV_STATE_PRESSED); // 添加按下状态样式
    lv_obj_add_flag(wind, LV_OBJ_FLAG_CHECKABLE); // 使按钮可切换状态
    lv_imgbtn_set_src(wind, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/wind.png", NULL); // 默认状态图片
    lv_imgbtn_set_src(wind, LV_IMGBTN_STATE_CHECKED_RELEASED, NULL, "S:/root/bluewind.png", NULL); // 选中状态图片

    add_close_button(content, win);              // 添加关闭按钮

    return win;                                  // 返回创建的窗口
}

// ==============================
// 智能灯窗口
// ==============================

/**
 * @brief 创建智能灯控制窗口
 * @param parent 父对象
 * @return 创建的智能灯窗口对象
 * 
 * 创建包含亮度控制的智能灯窗口
 */
lv_obj_t *create_smart_lamp_window(lv_obj_t *parent)
{
    lv_obj_t *win = create_base_window(parent);  // 创建基础窗口
    lv_obj_t *content = lv_win_get_content(win); // 获取内容区域

    // 创建智能灯显示标签
    lv_obj_t *lamp_label = lv_label_create(content); // 创建标签对象
    lv_label_set_text(lamp_label, "智能灯");     // 设置标签文本
    lv_obj_set_style_text_font(lamp_label, &chinese_ziku, 0); // 设置中文字体
    lv_obj_set_style_text_color(lamp_label, lv_color_white(), LV_PART_MAIN); // 设置文本颜色为白色
    lv_obj_align(lamp_label, LV_ALIGN_TOP_MID, 0, 10); // 设置标签对齐位置

    // 创建亮度控制滑动条
    lv_obj_t *smart_lamp = lv_slider_create(content); // 创建滑动条对象
    lv_obj_set_size(smart_lamp, 50, 200);        // 设置滑动条大小（垂直方向）
    lv_obj_align(smart_lamp, LV_ALIGN_CENTER, 0, 20); // 设置滑动条对齐位置
    lv_slider_set_range(smart_lamp, 0, 100);     // 设置亮度范围0-100
    lv_slider_set_value(smart_lamp, 50, LV_ANIM_OFF); // 设置初始亮度50

    // 设置滑动条样式
    lv_obj_set_style_bg_color(smart_lamp, lv_color_hex(0xffffff), LV_PART_MAIN); // 设置背景颜色为白色
    lv_obj_set_style_radius(smart_lamp, 10, LV_PART_INDICATOR); // 设置指示器圆角
    lv_obj_set_style_radius(smart_lamp, 10, LV_PART_MAIN); // 设置主圆角

    // 设置初始颜色（50%亮度对应的黄色）
    float initial_ratio = (float)(50 - 0) / (100 - 0); // 计算初始比例
    uint8_t initial_yellow = (uint8_t)(255 - (255 - 200) * initial_ratio); // 计算黄色分量
    uint8_t initial_blue = (uint8_t)(150 * (1.0 - initial_ratio)); // 计算蓝色分量
    lv_color_t initial_color = lv_color_make(initial_yellow, initial_yellow, initial_blue); // 创建初始颜色
    lv_obj_set_style_bg_color(smart_lamp, initial_color, LV_PART_INDICATOR); // 设置指示器颜色

    // 隐藏旋钮
    lv_obj_set_style_bg_opa(smart_lamp, LV_OPA_TRANSP, LV_PART_KNOB);     // 背景透明
    lv_obj_set_style_border_opa(smart_lamp, LV_OPA_TRANSP, LV_PART_KNOB); // 边框透明
    lv_obj_set_style_width(smart_lamp, 0, LV_PART_KNOB);                  // 设置旋钮宽度为0
    lv_obj_set_style_height(smart_lamp, 0, LV_PART_KNOB);                 // 设置旋钮高度为0

    lv_obj_add_event_cb(smart_lamp, slider_event_cb_yellow, LV_EVENT_VALUE_CHANGED, NULL); // 绑定滑动条事件

    add_close_button(content, win);              // 添加关闭按钮

    return win;                                  // 返回创建的窗口
}